package com.escool.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.escool.model.TbGrado;
import com.escool.model.TbNivel;
import com.escool.model.TbSeccion;
import com.escool.service.GradosService;
import com.escool.service.NivelesService;
import com.escool.service.SeccionesService;

@Controller
public class NivelesController {
	
	@Autowired
	NivelesService nivelesService;
	@Autowired
	GradosService gradosService;
	@Autowired
	SeccionesService seccionesService;
	
	@RequestMapping("showNiveles")
	public String listNiveles(Map<String, Object> map){
		map.put("niveles", new TbNivel());
		map.put("nivelesList", nivelesService.listNiveles());
		return "/niveles";
	}
	
	@RequestMapping(value = "addNiveles", method = RequestMethod.POST)
	public String addNiveles(@ModelAttribute("niveles") @Valid TbNivel niveles, BindingResult result){
		if (!result.hasErrors()) {
			nivelesService.addNiveles(niveles);
			return "redirect:/showNiveles";
		}
		return "";
	}
	
	@RequestMapping(value = "editNiveles", method = RequestMethod.POST)
	public String editNiveles(@ModelAttribute("niveles") @Valid TbNivel niveles, BindingResult result){
		if (!result.hasErrors()) {
			nivelesService.updateNiveles(niveles);
			return "redirect:/showNiveles";
		}
		return "";
	}
	
	@RequestMapping(value = "deleteNiveles", method = RequestMethod.POST)
	public String deleteNiveles(@ModelAttribute("niveles") @Valid TbNivel niveles, BindingResult result){
		if (!result.hasErrors()) {
			nivelesService.deleteNiveles(niveles.getIdNivel());
			return "redirect:/showNiveles";
		}
		return "";
	}
	
	/**
	 * Detalle Tbniveles has Tbgrados
	 */
	
	@RequestMapping(value = "showGrados", method = RequestMethod.POST)
	public String showGrados(@ModelAttribute("niveles") @Valid TbNivel niveles, BindingResult result, Map<String, Object> map){
		try{
			TbGrado grados = new TbGrado();
			grados.setTbNivel(niveles);
			
			map.put("grados", grados);
			map.put("gradosList", gradosService.listGrados(niveles.getIdNivel()));
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		return "/grados";
	}
	
	
	
	@RequestMapping(value = "showGradosDet")
	public String showGradosDet(@ModelAttribute("grados") @Valid TbGrado grados,BindingResult result, Map<String, Object> map,HttpServletRequest request){
		try{
			String idNivel = null;
			
			 idNivel = (String) request.getParameter("idNivel");
			 if(idNivel == null){
				 idNivel = String.valueOf(grados.getTbNivel().getIdNivel());
			 }
			 
			 grados.setTbNivel(null);
			 grados.setTbNivel(nivelesService.findNiveles(Integer.parseInt(idNivel)));
			 map.put("gradosList", gradosService.listGrados(Integer.parseInt(idNivel)));
		}
			 catch(Exception ex){
				 ex.printStackTrace();
			 }
		return "/grados";
	}
	
	@RequestMapping(value = "addGrados", method = RequestMethod.POST)
	public String addGrados(@ModelAttribute("grados") @Valid TbGrado grados,BindingResult result){
		if (!result.hasErrors()) {
			TbNivel tbNivel = nivelesService.findNiveles(grados.getTbNivel().getIdNivel());
			grados.setTbNivel(tbNivel);
			gradosService.addGrados(grados);
			return "redirect:/showGradosDet?idNivel="+grados.getTbNivel().getIdNivel();
		}
		return "";
	}
	
	@RequestMapping(value = "editGrados", method = RequestMethod.POST)
	public String editGrados(@ModelAttribute("grados") @Valid TbGrado grados,BindingResult result){
		if (!result.hasErrors()) {
			TbNivel tbNivel = nivelesService.findNiveles(grados.getTbNivel().getIdNivel());
			grados.setTbNivel(tbNivel);
			gradosService.updateGrados(grados);
			return "redirect:/showGradosDet?idNivel="+grados.getTbNivel().getIdNivel();
		}
		return "";
	}
	
	@RequestMapping(value = "deleteGrados", method = RequestMethod.POST)
	public String deleteGrados(@ModelAttribute("grados") @Valid TbGrado grados,BindingResult result){
		if (!result.hasErrors()) {
			TbNivel tbNivel = nivelesService.findNiveles(grados.getTbNivel().getIdNivel());
			grados.setTbNivel(tbNivel);
			gradosService.removeGrados(grados.getIdGrado());
			return "redirect:/showGradosDet?idNivel="+grados.getTbNivel().getIdNivel();
		}
		return "";
	}
	
	/**
	 * Grado has Seccion
	 */
	
	@RequestMapping(value = "showSecciones", method = RequestMethod.POST)
	public String showSecciones(@ModelAttribute("grados") TbGrado grados,BindingResult result,Map<String, Object> map){
		try{
			TbSeccion seccion = new TbSeccion();
			seccion.setTbGrado(grados);
			
			map.put("seccion", seccion);
			map.put("seccionList", seccionesService.listSecciones(grados.getIdGrado()));
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		return "/secciones";
	}
	
	@RequestMapping(value = "showSeccionesDet")
	public String showSeccionesDet(@ModelAttribute("seccion") TbSeccion seccion,BindingResult result,Map<String, Object> map, HttpServletRequest request){
		try{
			String idGrado = null;
			
			idGrado = (String) request.getParameter("idGrado");
			 if(idGrado == null){
				 idGrado = String.valueOf(seccion.getTbGrado().getIdGrado());
			 }
			 
			 seccion.setTbGrado(null);
			 seccion.setTbGrado(gradosService.findGrado(Integer.parseInt(idGrado)));
			 
			 map.put("seccionList",seccionesService.listSecciones(Integer.parseInt(idGrado)));
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		return "/secciones";
	}
	@RequestMapping(value = "addSeccion", method = RequestMethod.POST)
	public String addSeccion(@ModelAttribute("seccion") TbSeccion seccion,BindingResult result){
		if (!result.hasErrors()) {
			TbGrado grado = gradosService.findGrado(seccion.getTbGrado().getIdGrado());
			seccion.setTbGrado(grado);
			seccionesService.addSecciones(seccion);
			return "redirect:/showSeccionesDet?idGrado="+seccion.getTbGrado().getIdGrado();
		}
		return "";
	}
	
	@RequestMapping(value = "editSeccion", method = RequestMethod.POST)
	public String editSeccion(@ModelAttribute("seccion") TbSeccion seccion,BindingResult result){
		if (!result.hasErrors()) {
			TbGrado grado = gradosService.findGrado(seccion.getTbGrado().getIdGrado());
			seccion.setTbGrado(grado);
			seccionesService.updateSecciones(seccion);
			return "redirect:/showSeccionesDet?idGrado="+seccion.getTbGrado().getIdGrado();
		}
		return "";
	}
	
	@RequestMapping(value = "delSeccion", method = RequestMethod.POST)
	public String delSeccion(@ModelAttribute("seccion") TbSeccion seccion,BindingResult result){
		if (!result.hasErrors()) {
			TbGrado grado = gradosService.findGrado(seccion.getTbGrado().getIdGrado());
			seccion.setTbGrado(grado);
			seccionesService.removeSecciones(seccion.getIdSeccion());
			return "redirect:/showSeccionesDet?idGrado="+seccion.getTbGrado().getIdGrado();
		}
		return "";
	}

}
